package com.ebid.dom4j;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/*
*       遍历 xml 文件
* */

public class TestXML {

    public static void main(  String[] args) {
        TestXML test = new TestXML();
        try {
            test.testGetRoot();
        } catch (  Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取文件的xml对象，然后获取对应的根节点root
     */
    public void testGetRoot() throws Exception {
        //新建要生成的文件
        //创建document对象，代表整个xml文档
        Document documentNew = DocumentHelper.createDocument();
        documentNew.setXMLEncoding("UTF-8");

        Element rootElement = documentNew.addElement("winCandidateBulletinPhase");


        SAXReader sax = new SAXReader();                              // 创建一个SAXReader对象
        File xmlFile = new File("winCandidateBulletinPhaseXMLSchema.xsd");// 根据指定的路径创建file对象
        Document document = sax.read(xmlFile);                        // 获取document对象,如果文档无节点，则会抛出Exception提前结束
        Element root = document.getRootElement();                     // 获取根节点
        getNodes(root,rootElement);                                   // 从根节点开始遍历所有节点


        document.remove(rootElement);

        //5.设置生成xml的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");

        //6.生成xml文件
        File file = new File("winCandidateBulletinPhase.xml");
        XMLWriter writer;
        try {
            writer = new XMLWriter(new FileOutputStream(file), format);
            //设置是否转义，默认值是true，代表转义
            writer.setEscapeText(false);
            writer.write(documentNew);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从指定节点Element node开始,递归遍历其所有子节点
     */
    public void getNodes(Element node,Element nodeNew) {

        Element element = null;
        if (element == null){
            element = nodeNew;
        }
        if("element".equals(node.getName()) ) {
            System.out.println("-------开始新节点-------------");
            // 当前节点的名称、文本内容和属性
            System.out.println("当前节点名称：" + node.getName());           // 当前节点名称
            System.out.println("当前节点的内容：" + node.getTextTrim());     // 当前节点内容

            List<Attribute> listAttr = node.attributes();                     // 当前节点的所有属性

            if (listAttr.size() > 0){
                Attribute attribute = listAttr.get(0);
                System.out.println("element name: "+attribute.getValue());
                //拼接新的文档
                element = nodeNew.addElement(attribute.getValue());
                element.setText(" ");
            }
        }

        // 递归遍历当前节点所有的子节点
        List<Element> listElement = node.elements();                       // 所有一级子节点的list
        for (Element e : listElement) {                                    // 遍历所有一级子节点
            getNodes(e ,element);                                          // 递归
        }
    }





     /*
            for (Attribute attr : listAttr) {                               // 遍历当前节点的所有属性
                String name = attr.getName();                                // 属性名称
                String value = attr.getValue();                              // 属性的值
                System.out.println("属性名称：" + name + "---->属性值：" + value);

                //拼接新的文档
                Element element = nodeNew.addElement(value);
                element.setText(" ");
            }
            */
}
